#ifndef SHEPJSON_H__
#define SHEPJSON_H__

#include <cstddef>// size_t
#include <cassert>// assert
#include <string>

using namespace std;

using shep_type = enum {SHEP_NULL, SHEP_FALSE, SHEP_TRUE, SHEP_NUMBER, SHEP_STRING, SHEP_ARRAY, SHEP_OBJECT};

/**
 * json 节点类
 * 默认类型为 SHEP_NULL
 */
class shep_value{
private:
    string s;
    double n;
    shep_type type; 
public:
    shep_value():type(SHEP_NULL){}

    void set_type(shep_type data){this->type = data;}
    
    shep_type get_type(){return this->type;};


    void set_number(double num){this->n = num;this->type = SHEP_NUMBER;}

    void set_boolean(bool data){this->type = (data ? SHEP_TRUE : SHEP_FALSE);}
    
    void set_string(const char* str, size_t len){this->s = string(str, len);this->type = SHEP_STRING;}

    void set_null(){this->type = SHEP_NULL;}

    double get_number(){
        assert(this->type == SHEP_NUMBER);
        return this->n;
    }

    bool get_boolean(){
        assert(this->type == SHEP_TRUE || this->type == SHEP_FALSE);
        return (this->type == SHEP_TRUE) ? true : false;
    }

    const char* get_string(){
        assert(this->type == SHEP_STRING);
        return this->s.c_str();
    }

    size_t get_string_length(){return this->s.length();}
};

enum{//解析结果
    SHEP_PARSE_OK = 0,              //解析成功
    SHEP_PARSE_EXCEPT_VALUE,        //字符串只含有空白
    SHEP_PARSE_INVALID_VALUE,       //字符串不正确
    SHEP_PARSE_ROOT_NOT_SINGULAR,   //字符串在最后的空白后还有其他字符
    SHEP_PARSE_NUMBER_TOO_BIG,      //解析的数字过大
    SHEP_PARSE_MISS_QUOTATION_MARK, //缺失后面的对应引号
    SHEP_PARSE_INVALID_STRING_ESCAPE,//非法转义字符
    SHEP_PARSE_INVALID_STRING_CHAR, //非法字符 即 ASCii 前 32 个非打印字符
    SHEP_PARSE_INVALID_UNICODE_HEX, //非法 unicode 字符
    SHEP_PARSE_INVALID_UNICODE_SURROGATE // 非法代理对(对 0x10000 ~ 0x10FFFF 范围内的 unicode 字符会使用代理对)
};

int shep_parse(shep_value& v, const char* json);

#endif // SHEPJSON_H__